// TODO：函数对象上的原型
// 函数本身就是一个对象类型，即：函数对象
// 注意：当我们创建一个函数时（普通函数、构造函数），解析器都会向函数中
// 添加一个属性prototype，这个属性对应一个对象，该对象就是“原型对象”

// 如果函数作为普通函数调用，则prototype属性没有什么作用（要不要都可以）
// 当函数当作构造函数调用时，会有作用
// 如：
// 使用 new 构造函数()，创建对象时，创建的对象中会有一个隐藏的属性
// 指向构造函数的“原型对象”，该属性为：__proto__
// 我们可以通过该属性，来访问获取构造函数上“原型对象”
function Person() { }
let person = new Person();
console.log(Person.prototype === person.__proto__);     // true

// 原型对象的作用：
// 相当于一个公共区域，所有同一个类的实例都可以访问到这个原型对象
// 所以我们可以将对象中共有的内容，设置到原型对象中

// 当我们访问一个对象的属性或方法时，它会先在对象自身上寻找，有则直接使用
// 没有则去原型对象中寻找（通过__proto__），如果找到则直接使用，没有找到
// 则去原型对象的原型对象找，有直接使用，没有则继续向上寻找，直到找到
// Object对象的原型对象（最顶端），如果还是没有，则返回undefined


// TODO：constructor属性
// 指向该原型对象的构造函数
// 如：
function Person() { }
Person.prototype.constructor === Person